package funcionesDeMutacion;

import java.util.ArrayList;

import util.Aleatorio;

import cromosomas.Arbol;
import cromosomas.CromosomaEstrategia;
import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncMutacion;

public class MutacionDeInicializacion implements FuncMutacion {

	@Override
	public void mutar(Cromosoma cr) {
		CromosomaEstrategia cre = (CromosomaEstrategia)cr;
		ArrayList<Arbol> nodos = obtenerNodos(cre.getArbol());
		if(nodos.size()!=0){
			int pos = Aleatorio.getIntAleatorio(nodos.size());
			int prof;
			if(cre.isCompleto())
				prof=cre.getProfundidad()-nodos.get(pos).getProfundidad();
			else
				prof=0;
			if(nodos.get(pos).getPadre()!=null){
				int prof_restante=cre.getProfundidad()-nodos.get(pos).getProfundidad();
				nodos.get(pos).setArbol(cre.crearArbol(nodos.get(pos).getPadre(), prof, prof_restante, nodos.get(pos).getProfundidad()));
			}
			else
				cre.setArbol(cre.crearArbol(null, prof, cre.getProfundidad(),nodos.get(pos).getProfundidad()));
		}
	}
	
	private ArrayList<Arbol> obtenerNodos(Arbol ar){
		ArrayList <Arbol> listaTerminales = new ArrayList<Arbol>();
		listaTerminales.add(ar);
		for(int i=0; i<ar.getNum_hijos(); i++)
			listaTerminales.addAll(obtenerNodos(ar.getHijos()[i]));
		return listaTerminales;
	}
	
//	private Arbol buscarNodo(Arbol or, Arbol ob, int num_hijo){
//		Arbol res = null;
//		if(or.equals(ob))
//			res = or.getPadre().getHijos()[num_hijo];
//		else
//			for(int i=0; i<or.getNum_hijos(); i++){
//				res = buscarNodo(or.getHijos()[i],ob,i);
//				if(res!=null)
//					break;
//			}
//		return res;
//	}
	
}
